package com.sky.chapter3.lockSupport;


import java.util.concurrent.TimeUnit;
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.LockSupport;
import java.util.concurrent.locks.ReentrantLock;

/**
 * LockSupport类中的park等待和 unpark唤醒
 * <p>
 * 通过park()和unpark(thread)方法来实现阻塞和唤醒线程的操作
 * LockSupport是用来创建锁和其他同步类的基本线程阻塞原语。
 * <p>
 * ​ LockSupport类使用了一种名为 Permit（许可）的概念来做到阻塞和唤醒线程的功能，
 * 每个线程都有一个许可(permit)， permit只有两个值1和零，默认是零。 可以把许可看成是一种(0,1)信号量（Semaphore），
 * 但与 Semaphore 不同的是，许可的累加上限是1
 */
public class LockSupportDemo6 {


    public static void main(String[] args) {
        //正常使用+不需要锁块  照样不会报错
        Thread t1 = new Thread(() -> {
            System.out.println(Thread.currentThread().getName() + " " + "1111111111111");
            LockSupport.park();
            System.out.println(Thread.currentThread().getName() + " " + "2222222222222------end被唤醒");
        }, "t1");
        t1.start();

        //暂停几秒钟线程
        try {
            TimeUnit.SECONDS.sleep(3);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        LockSupport.unpark(t1);
        System.out.println(Thread.currentThread().getName() + "   -----LockSupport.unparrk() invoked over");

    }
}
